Grundlagen: Familien in der Revit API
Familien in Revit sind wiederverwendbare Elemente wie Türen, Fenster oder Möbel. Die Revit API bietet umfangreiche Möglichkeiten, Familien zu laden, erstellen, bearbeiten und verwalten.
Family → FamilySymbol (Typ) → FamilyInstance (Instanz im Projekt)Wichtige Klassen & Namespaces
| Klasse / Objekt | Beschreibung | Namespace |
|---|---|---|
Family |
Repräsentiert eine Familie im Projekt oder in der Bibliothek. | Autodesk.Revit.DB |
FamilySymbol |
Ein Typ innerhalb einer Familie (z. B. eine bestimmte Türgröße). | Autodesk.Revit.DB |
FamilyInstance |
Eine Instanz einer Familie im Projekt (z. B. eine Tür in einer Wand). | Autodesk.Revit.DB |
IFamilyLoadOptions |
Interface für das Laden von Familien mit benutzerdefinierten Optionen. | Autodesk.Revit.DB |
Document |
Das aktuelle Revit-Dokument – Ausgangspunkt aller API-Operationen. | Autodesk.Revit.DB |
FilteredElementCollector |
Effiziente Abfrage aller Elemente eines bestimmten Typs im Dokument. | Autodesk.Revit.DB |
Familien laden und verwalten
Familie aus einer RFA-Datei laden
C#
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
public void LoadFamily(Document doc, string familyPath)
{
// Familie aus RFA-Datei laden
Family family;
doc.LoadFamily(familyPath, out family);
if (family != null)
{
TaskDialog.Show("Erfolg", "Familie geladen: " + family.Name);
}
}
Python (pyRevit / RPS)
family_path = "C:/Familien/Tür.rfa"
family = doc.LoadFamily(family_path)
if family:
print("Familie geladen:", family.Name)
Familie mit benutzerdefinierten Optionen laden
Verwende IFamilyLoadOptions, um das Verhalten beim Laden zu steuern – z. B. ob vorhandene Parameter überschrieben werden sollen.
C#
public class FamilyLoadOptions : IFamilyLoadOptions
{
public bool OnFamilyFound(bool familyInUse, out bool overwriteParameterValues)
{
overwriteParameterValues = true;
return true;
}
public bool OnSharedFamilyFound(bool familyInUse, out bool overwriteParameterValues)
{
overwriteParameterValues = true;
return true;
}
}
// Verwendung:
doc.LoadFamily(familyPath, new FamilyLoadOptions(), out Family family);
IFamilyLoadOptions ist in Python nicht direkt implementierbar. Für diesen Anwendungsfall ist ein C#-Add-In oder Dynamo erforderlich.Familien erstellen
Das Erstellen neuer Familien erfolgt meist über die Revit-Benutzeroberfläche. Die API kann verwendet werden, um leere Familien zu erstellen oder bestehende Familien programmatisch zu modifizieren.
Leere Familie erstellen
C#
using (Transaction t = new Transaction(doc, "Neue Familie"))
{
t.Start();
// Neue Familie erstellen
Family family = new Family();
doc.Create.NewFamily(doc, family);
// Familie als RFA speichern
string familyPath = "C:/Familien/Neue_Familie.rfa";
doc.SaveFamily(familyPath);
t.Commit();
}
Familieninstanzen platzieren
Eine Familieninstanz ist eine konkrete Platzierung einer Familie im Projekt. Bevor eine Instanz erstellt werden kann, muss der FamilySymbol aktiviert werden.
symbol.Activate() vor NewFamilyInstance() aufrufen – sonst folgt eine InvalidOperationException.Familieninstanz im Projekt platzieren
C#
public void PlaceFamilyInstance(Document doc, FamilySymbol symbol, XYZ location)
{
using (Transaction t = new Transaction(doc, "Instanz platzieren"))
{
t.Start();
// Symbol aktivieren – Pflicht!
if (!symbol.IsActive)
symbol.Activate();
FamilyInstance instance = doc.Create.NewFamilyInstance(
location,
symbol,
StructuralType.NonStructural
);
t.Commit();
}
}
Python
from Autodesk.Revit.DB import XYZ, StructuralType, Transaction
location = XYZ(10, 5, 0)
# Symbol aktivieren
if not symbol.IsActive:
symbol.Activate()
with Transaction(doc, "Instanz platzieren") as t:
t.Start()
instance = doc.Create.NewFamilyInstance(
location, symbol, StructuralType.NonStructural
)
t.Commit()
Familienparameter verwalten
Parameter einer Familieninstanz lesen
C#
public void ReadFamilyParameters(FamilyInstance instance)
{
foreach (Parameter param in instance.Parameters)
{
string name = param.Definition.Name;
string value = param.AsValueString() ?? param.AsString();
TaskDialog.Show("Parameter", $"{name}: {value}");
}
}
Python
for param in instance.Parameters:
name = param.Definition.Name
value = param.AsValueString() or param.AsString()
print(f"{name}: {value}")
Parameter einer Familieninstanz ändern
C#
public void SetParameter(Document doc, FamilyInstance instance,
string paramName, double newValue)
{
using (Transaction t = new Transaction(doc, "Parameter ändern"))
{
t.Start();
Parameter param = instance.LookupParameter(paramName);
if (param != null && !param.IsReadOnly)
param.Set(newValue);
t.Commit();
}
}
Python
from Autodesk.Revit.DB import Transaction
with Transaction(doc, "Parameter setzen") as t:
t.Start()
param = instance.LookupParameter("Breite")
if param and not param.IsReadOnly:
param.Set(1.2) # Wert in Fuß (Revit-interne Einheit)
t.Commit()
UnitUtils.ConvertToInternalUnits() umrechnen.Parameter in der UI bearbeiten
Manchmal ist es sinnvoll, Parameter über die Revit-Benutzeroberfläche anzuzeigen oder zur Eingabe aufzufordern. Hierfür bietet die API den TaskDialog sowie das InputBox-Pattern.
Parameter über TaskDialog abfragen (C#)
using (TaskDialog td = new TaskDialog("Parameter bearbeiten"))
{
td.MainInstruction = "Welchen Parameter möchtest du ändern?";
td.MainContent = "Wähle eine Option aus.";
td.AddCommandLink(TaskDialogCommandLinkId.CommandLink1, "Breite ändern");
td.AddCommandLink(TaskDialogCommandLinkId.CommandLink2, "Höhe ändern");
TaskDialogResult result = td.Show();
if (result == TaskDialogResult.CommandLink1)
{
// → Breite ändern
}
else if (result == TaskDialogResult.CommandLink2)
{
// → Höhe ändern
}
}
Familien im Dokument finden
Alle geladenen Familien im aktuellen Projekt auflisten – nützlich für Export, Qualitätsprüfung oder Batch-Operationen.
Alle Familien auflisten
C#
FilteredElementCollector collector = new FilteredElementCollector(doc)
.OfClass(typeof(Family));
foreach (Family family in collector.Cast<Family>())
{
// Familientypen auflisten
foreach (ElementId symbolId in family.GetFamilySymbolIds())
{
FamilySymbol sym = doc.GetElement(symbolId) as FamilySymbol;
TaskDialog.Show("Familie", $"{family.Name} → {sym.Name}");
}
}
Python
from Autodesk.Revit.DB import FilteredElementCollector, Family
families = FilteredElementCollector(doc).OfClass(Family)
for family in families:
for sym_id in family.GetFamilySymbolIds():
sym = doc.GetElement(sym_id)
print(f"{family.Name} → {sym.Name}")
Familieninstanzen nach Typ suchen
from Autodesk.Revit.DB import FilteredElementCollector, FamilyInstance
# Alle FamilyInstances im Modell
instances = FilteredElementCollector(doc)\
.OfClass(FamilyInstance)\
.ToElements()
# Nur bestimmten Typ
TARGET = "Einfache Tür"
filtered = [i for i in instances if i.Symbol.FamilyName == TARGET]
print(f"{len(filtered)} Instanzen gefunden")
Häufige Fehler & Lösungen
| Fehler / Exception | Ursache & Lösung |
|---|---|
InvalidOperationException |
Transaktion nicht gestartet oder nicht korrekt beendet. Immer t.Start() und t.Commit() aufrufen. |
ArgumentException |
Ungültiger Pfad oder Familienname. Pfad auf Existenz prüfen, Sonderzeichen beachten. |
ArgumentNullException |
Übergabe von null-Objekten. Immer Null-Check vor API-Aufrufen einbauen. |
| FamilySymbol nicht aktiv | Vor NewFamilyInstance() immer symbol.Activate() aufrufen. |
| Familie wird nicht geladen | RFA-Datei nicht mit Revit-Version kompatibel. Version prüfen oder in Revit öffnen und neu speichern. |
| Parameterwert hat keine Wirkung | Parameter ist evtl. IsReadOnly == true (formelgesteuert oder gesperrt). Vor Set() immer prüfen. |
| Falscher Einheitenwert | Revit speichert Längen in Fuß. Konvertierung: UnitUtils.ConvertToInternalUnits(wert, UnitTypeId.Meters) |
Nützliche Ressourcen
Dokumentation & API-Referenz
- Offizielle Revit API Dokumentation (revitapidocs.com) ↗
- Revit API Referenz 2024 ↗
- The Building Coder – Jeremy Tammik's Blog ↗